package org.whh.automatic.ui.dialog;

import javax.swing.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 对话框管理器
 * <p>
 * 该类用于解决应用程序中多个页面同时打开导致界面繁杂的问题，实现一次只显示一个对话框的效果。
 * <p>
 * 在原有设计中，当用户打开任务编辑、步骤编辑、快捷键录制、坐标捕获等多个对话框时，
 * 这些窗口会同时显示在屏幕上，造成界面混乱。使用该管理器后，保持原有层次结构：
 * 任务列表页面 -> 编辑任务页面 -> 编辑步骤页面 -> 坐标捕获页面/快捷键录入页面，
 * 但一次只会显示其中的一个页面，当打开新页面时，会自动隐藏之前的页面，
 * 当关闭当前页面时，会自动恢复之前的页面。
 * <p>
 * 主要功能：
 * 1. 记录当前显示的对话框
 * 2. 在显示新对话框时隐藏已显示的对话框
 * 3. 在对话框关闭时恢复前一个对话框的显示
 * 4. 支持对话框之间的层级关系
 * <p>
 * 典型用法：
 * DialogManager.getInstance().showDialog(newDialog, parentDialog);
 */
public class DialogManager {

    private static DialogManager instance;
    private List<JDialog> dialogStack = new ArrayList<>();

    private DialogManager() {
        // 私有构造函数，实现单例模式
    }

    /**
     * 获取DialogManager的单例实例
     *
     * @return DialogManager实例
     */
    public static synchronized DialogManager getInstance() {
        if (instance == null) {
            instance = new DialogManager();
        }
        return instance;
    }

    /**
     * 显示一个新的对话框，并隐藏当前显示的对话框
     *
     * @param newDialog    要显示的新对话框
     * @param parentDialog 父对话框
     */
    public void showDialog(JDialog newDialog, JDialog parentDialog) {
        if (!dialogStack.isEmpty()) {
            // 隐藏当前显示的对话框
            JDialog currentDialog = dialogStack.get(dialogStack.size() - 1);
            currentDialog.setVisible(false);
        }

        // 添加新对话框到栈中
        dialogStack.add(newDialog);

        // 设置关闭监听器，在对话框关闭时恢复前一个对话框
        newDialog.addWindowListener(new java.awt.event.WindowAdapter() {
            @Override
            public void windowClosing(java.awt.event.WindowEvent e) {
                closeTopDialog();
            }

            @Override
            public void windowClosed(java.awt.event.WindowEvent e) {
                closeTopDialog();
            }
        });

        // 显示新对话框
        newDialog.setVisible(true);
    }

    /**
     * 关闭当前显示的对话框，并恢复前一个对话框的显示
     */
    public void closeTopDialog() {
        if (!dialogStack.isEmpty()) {
            // 移除栈顶对话框
            dialogStack.remove(dialogStack.size() - 1);

            // 恢复前一个对话框的显示
            if (!dialogStack.isEmpty()) {
                JDialog previousDialog = dialogStack.get(dialogStack.size() - 1);
                previousDialog.setVisible(true);
                previousDialog.toFront();
            }
        }
    }

    /**
     * 关闭所有对话框
     */
    public void closeAllDialogs() {
        // 从后向前关闭所有对话框
        for (int i = dialogStack.size() - 1; i >= 0; i--) {
            JDialog dialog = dialogStack.get(i);
            dialog.dispose();
        }
        dialogStack.clear();
    }

    /**
     * 获取当前显示的对话框
     *
     * @return 当前显示的对话框，如果没有则返回null
     */
    public JDialog getCurrentDialog() {
        if (!dialogStack.isEmpty()) {
            return dialogStack.get(dialogStack.size() - 1);
        }
        return null;
    }

    /**
     * 获取当前对话框的个数
     *
     * @return 当前对话框的个数
     */
    public int getDialogCount() {
        return dialogStack.size();
    }
} 